package com.lp.multi.lock;

import java.util.concurrent.TimeUnit;

/**
 * @author: lp
 * @create: 2021-06-27 11:35
 * @description: 八锁现象8
 * 一个静态同步方法、一个普通同步方法(两把锁)，两个不同对象，2把锁
 * 执行结果：
 * B:call msg
 * A:send msg
 * 原因：static synchronized 锁的对象是类对象,一个类只有一把锁,A线程先获得类对象锁，B线程获取phone2对象锁。两把锁互不影响
 */
public class ILock {
    public static void main(String[] args) {
        Phone8 phone1 = new Phone8();
        Phone8 phone2 = new Phone8();

        new Thread(()->{
            phone1.sendMsg();
        },"A").start();

        try {
            //主线程sleep,B线程未获取锁前，确保A线程获取了锁
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone2.call();
        },"B").start();
    }
}

    class Phone8{

        //static synchronized 锁的对象是类对象,一个类只有一把锁
        public static synchronized void sendMsg(){
            try {
                //sleep不会释放锁，时间到后，代码继续执行
                TimeUnit.SECONDS.sleep(4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+":"+"send msg");
        }

        //synchronized普通方法修饰，锁的是调用对象
        public  synchronized void call(){
            System.out.println(Thread.currentThread().getName()+":"+"call msg");
        }


    }